import router from '@/router'
import store from '@/store'
import { setLocalStorage, getLocalStorage } from '@/utils/localStorage'
import { getToken, setToken, getMenu, getLogoutFlag, setLogoutFlag, removeLogoutFlag, removeOperateTime} from '@/utils/auth'
import getPageTitle from '@/utils/getPageTitle'
import aes from '@/utils/aes'
import { isLocal } from '@/settings.js'
import bus from '@/api/bus.js'
import { postRefreshToken } from 'api/http.js'
import { getExpiresTime } from 'api/expires.js'
import { MessageBox } from 'element-ui'
// 白名单
const whiteList = ['/login', '/claim', '/resetpwd', '/register']
const noRedirectlist = ['/home', '/404', '/']
// 获取url参数
const getOtherQuery = (query) => {
  return Object.keys(query).reduce((acc, cur) => {
    if (cur !== 'redirect') {
      acc[cur] = query[cur]
    }
    return acc
  }, {})
}
// -防抖 所谓防抖，就是指触发事件后，就是把触发非常频繁的事件合并成一次去执行。即在指定时间内只执行一次回调函数，
// 如果在指定的时间内又触发了该事件，则回调函数的执行时间会基于此刻重新开始计算。
let timerDebounce = null
const debounce = (fn, wait = 1000) => {
    // console.log('wait', wait)
	if(timerDebounce) {
		// console.log('防抖状态')
		timerDebounce && clearTimeout(timerDebounce)
	}
	let callNow = !timerDebounce
	timerDebounce = setTimeout(() => {
		timerDebounce = null
	}, wait)
  if(callNow) {
		// console.log('===执行函数===',timerDebounce)
		fn() //执行函数
	}
}

router.beforeEach(async (to, from, next) => {
  let temp = next;
  // console.log('###to###', to)
  next = function (args) {
    if(!args) {
      let MessageBox1 = MessageBox;
      checkNewVersion(function(){
        MessageBox1.confirm('发现有新版本,请立即升级', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          closeOnClickModal: false,
          type: 'warning'
        }).then(() => {
          window.location.reload(true)
        })
      })
    }
    temp(args);
    let appConfig = store.state.settings.appConfig
    let listCloseAutoSearch = appConfig && appConfig.baseConfig && appConfig.baseConfig.listCloseAutoSearch
    // console.log('==listCloseAutoSearch==', listCloseAutoSearch)
    if (!listCloseAutoSearch) {
      setTimeout(() => {
        debounce(() => {
          bus.$emit('selectedRowCurr', '')
        }, 2000)
      }, 1000)
    }
  }
  const tourl = to.query.tourl || ''
  // 中台跳转 || to.path === '/dlogin'
  // 中台跳转 || to.path === '/sm2login'
  if (to.path === '/dlogin') {
    const _aestoken = to.query.token
    const redirecturl = to.query.redirect || to.query.redirecturl || ''
    // setLogoutFlag(false)
    removeLogoutFlag()
    removeOperateTime()
    // 第三方跳转，直接删除本地缓存医院列表数据（医院列表、排班组件选项暂存数据、用户权限医院列表数据）
    await store.dispatch('user/removeLocalInfo')
    if (redirecturl) {
      setLocalStorage('resetRedirect', redirecturl)
    }
    let _tokenObj = null
    if (_aestoken) {
      // url中的token不是单纯的token，里面是一个对象的加密信息，需要解密后，再从对象中取出accessToken、expires、refreshToken三个信息并缓存起来,
      _tokenObj = JSON.parse(aes.AESDecrypt(decodeURIComponent(_aestoken)))
      // 本地刷新令牌，未调用接口
      await store.dispatch('user/setNewTokenInfo', _tokenObj)
      await store.dispatch('user/getMenu')
    }
    // QT那边的单点登录
    if (!redirecturl && tourl == 'checkSourceEnquiry') {
      let toPath = ''
      if (_tokenObj && _tokenObj.accessionNo) {
        toPath = `/check/sourceEnquiry?accessionNo=${aes.AESEncrypt(_tokenObj.accessionNo)}`
      } else {
        toPath = `/check/sourceEnquiry?${to.fullPath.split('?')[1]}`
      }
      // + to.fullPath.split('?')[1] // `/check/registration?from=qt&applyDepartment=${to.query.applyDepartment}&isCanSwitch=${to.query.isCanSwitch}`
      // to.fullPath // '/check/registration?from=QT' // ?from=QT&applyDepartment=发热门诊&isSwitch=1
      setLocalStorage('resetRedirect', toPath)
      next({ path: toPath || '/home' })
    } else {
      next({ path: redirecturl || '/' })
    }
    return
  }

  // 中台跳转 || to.path === '/logging'
  if (to.path === '/logging') {
    const _aestoken = to.query.token
    let redirecturl = to.query.redirect || to.query.redirecturl || ''
    if (redirecturl) {
      redirecturl = decodeURIComponent(redirecturl)
    }
    let _tokenObj = null
    // setLogoutFlag(false)
    removeLogoutFlag()
    removeOperateTime()
    // 第三方跳转，直接删除本地缓存医院列表数据（医院列表、排班组件选项暂存数据、用户权限医院列表数据）
    await store.dispatch('user/removeLocalInfo')
    if (redirecturl) {
      setLocalStorage('resetRedirect', redirecturl)
    }
    if (_aestoken) {
      const decodeURI = decodeURIComponent(_aestoken)
      // console.log('decodeURIComponent', decodeURI)
      // url中的token不是单纯的token，里面是一个对象的加密信息，需要解密后，再从对象中取出accessToken、expires、refreshToken三个信息并缓存起来,
      _tokenObj = JSON.parse(aes.AESDecrypt(decodeURI))
      // 本地刷新令牌，未调用接口
      await store.dispatch('user/setNewTokenInfo', _tokenObj)
      await store.dispatch('user/getMenu')
    }
    // QT那边的单点登录
    if (to.path == '/logging') {
      // 通过token来获取用户信息
      await store.dispatch('user/getInfo').then(res => {
        if (to.query.from && to.query.from.toLowerCase() == 'qt' && !tourl) {
          let toPath = `/check/registration` // `/check/registration?from=qt&applyDepartment=${to.query.applyDepartment}&isCanSwitch=${to.query.isCanSwitch}`
          // to.fullPath // '/check/registration?from=QT' // ?from=QT&applyDepartment=发热门诊&isSwitch=1
          // if (tourl == 'checkRegistration') toPath = `/check/registration`
          setLocalStorage('resetRedirect', toPath)
          next({ path: toPath || '/home' })
        } else if (!to.query.from && redirecturl) {
          // let toPath = `${redirecturl}?${to.fullPath.split('?')[1]}`
          let toPath = ''
          if (_tokenObj && _tokenObj.accessionNo) {
            toPath = `${redirecturl}?accessionNo=${aes.AESEncrypt(_tokenObj.accessionNo)}`
          } else {
            toPath = `${redirecturl}?${to.fullPath.split('?')[1]}`
          }
          setLocalStorage('resetRedirect', toPath)
          next({ path: toPath || '/home' })
        } else if (!redirecturl && tourl == 'checkSourceEnquiry') {
          let toPath = ''
          if (_tokenObj && _tokenObj.accessionNo) {
            toPath = `/check/sourceEnquiry?accessionNo=${aes.AESEncrypt(_tokenObj.accessionNo)}`
          } else {
            toPath = `/check/sourceEnquiry?${to.fullPath.split('?')[1]}`
          }
          // + to.fullPath.split('?')[1] // `/check/registration?from=qt&applyDepartment=${to.query.applyDepartment}&isCanSwitch=${to.query.isCanSwitch}`
          // to.fullPath // '/check/registration?from=QT' // ?from=QT&applyDepartment=发热门诊&isSwitch=1
          setLocalStorage('resetRedirect', toPath)
          next({ path: toPath || '/home' })
        } else {
          next({ path: redirecturl || '/home' })
        }
      })
    } else {
      next({ path: redirecturl || '/home' })
    }
    return
  }
  // 福鼎市医院的单点登录
  if (to.path === '/sm2login') {
    const data = to.query.data
    const hospitalcode = to.query.hospitalcode
    // 第三方跳转，直接删除本地缓存医院列表数据（医院列表、排班组件选项暂存数据、用户权限医院列表数据）
    await store.dispatch('user/removeLocalInfo')

    if (data) {
      // 福鼎市医院的单点登录
      let params = {
        data,
        hospitalcode
      }
       // // console.log('params', params)
      await store.dispatch('user/loginByTokensm2', params).then(res => {
         // // console.log('loginByTokensm2_res', res)
      })
      await store.dispatch('user/getMenu')
    }
    await store.dispatch('user/getInfo').then(res => {
      let toPath = ''
      if (to.query.tourl == 'checkSourceEnquiry') {
        if (to.query.accessionNo) {
          toPath = `/check/sourceEnquiry?accessionNo=${to.query.accessionNo}`
        } else {
          toPath = `/check/sourceEnquiry?${to.fullPath.split('?')[1]}`
        }
      } else {
        toPath = '/check/registration'
      }
      setLocalStorage('resetRedirect', toPath)
      next({
        path: toPath
      })
    })
    return
  }
  // 设置title
  document.title = getPageTitle(to.meta.title)
  // 判断用户是否登录
  const hasToken = getToken()
  if (isLocal) {
    next()
    return
  }

  const query = to.query
  let otherQuery = null
  if (query) {
    otherQuery = getOtherQuery(query)
  }
  if (hasToken) {
    if (to.path === '/login') {
      // 已登录 跳转到首页
      next({ path: '/' })
    } else if (getExpiresTime() > 0) {
      // 用户信息
      const userName = store.getters.name
      if (userName) {
        // console.warn('getMenu()1')
        // 非单点登录的状态
        // 如果菜单是空的 应该给予提示 退出登录 空的可能是 ‘’ ， []
        // if (!getMenu() || JSON.parse(getMenu()).length == 1) {
        //   //  // // console.log('logout1')
        //   // store.dispatch('user/logout')
        //   // next({
        //   //   path: '/login',
        //   //   query: { ...otherQuery, 'redirect': to.path }
        //   // })
        //   // bus.$message.warning('您还没有权限，请联系管理员！')
        // } else {
        //   console.log('获取医院列表')
        //   // 获取医院列表
        //   // const hospList = getLocalStorage('hospitalOptions')
        //   // if (!hospList) {
        //   //   await store.dispatch('user/getHospitalOptions')
        //   // }
        //   next()
        // }
        next()
      } else {
        console.warn('getMenu()2')
        try {
          // 先判断token过期没
          // 获取用户信息
          //  // // console.log('not have userName user/getInfo')
          await store.dispatch('user/getInfo')
          // 获取用户菜单
          //  // // console.log('获取用户菜单')
          // await store.dispatch('user/getMenu')
          if (!getMenu() || JSON.parse(getMenu()).length == 1) {
            //  // // console.log('logout2')
            store.dispatch('user/logout')
            next({
              path: '/login',
              query: { ...otherQuery, 'redirect': to.path }
            })
            bus.$message.warning('您还没有权限，请联系管理员！')
          } else {
            next({ ...to, replace: true })
          }
        } catch (error) {
          //  // // console.log('logout3')
          store.dispatch('user/logout')
          next({
            path: '/login',
            query: { ...otherQuery, 'redirect': to.path }
          })
        }
      }
    } else {
       // // console.log('token过期了')
      // token过期了
      const refreshRes = await postRefreshToken()
      //  // // console.log('refreshRes', refreshRes)
      if (refreshRes) {
        if (!store.getters.name) {
          await store.dispatch('user/getInfo')
        }
        next()
      } else {
        //  // // console.log('logout4')
        if (!(to.path == '/logging')){
          store.dispatch('user/logout')
        } else {
          next()
        }
        next({
          path: '/login',
          query: { ...otherQuery, 'redirect': to.path }
        })
      }
    }
  } else {
    //  // // console.log('logout5')
    if (!(to.path == '/logging')){
      store.dispatch('user/logout')
    } else {
      next()
    }
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      if (noRedirectlist.indexOf(to.path) !== -1) {
        next(`/login`)
      } else {
        next({
          path: '/login',
          query: { ...otherQuery, 'redirect': to.path }
        })
      }
    }
  }
})
